package tools

import (
	"net/url"
)

type Argument struct {
	Key             string          `json:"key,required" bson:"key,required"`
	Value           string          `json:"value" bson:"value"`
	ArgumentOpinion ArgumentOpinion `json:"argument_opinion" json:"argument_opinion"`
	ArgumentType    ArgumentType    `json:"argument_type" bson:"argument_type"`
	Function        Function        `json:"function" bson:"function"`
	Description     string          `json:"description" bson:"description"`
}

type Arguments []Argument

type Function struct {
	FunctionName string `json:"function_name,required" bson:"function_name,required"`
	Parameter    string `json:"parameter" bson:"parameter"`
}

type ArgumentType string

const (
	Param         ArgumentType = "param"  // url ?拼接
	PathVariables ArgumentType = "path"   // :path 值替换
	Header        ArgumentType = "header" //  header
	Body          ArgumentType = "body"   // body
	Auto          ArgumentType = "auto"   // auto 不论类型
)

type ArgumentOpinion string

const (
	Empty    ArgumentOpinion = ""
	Required ArgumentOpinion = "required"
	Static   ArgumentOpinion = "static"
)

var tools = []struct {
	Value       string `json:"value"`
	Description string `json:"description"`
}{
	{"nowTimestamp", "获取当前时间戳 示例：nil"},
	{"nowFormat", `获取当前格式化时间 示例：(2006-02-04 15-04-05)`},
	{"replace", `可以对传入的值进行格式化 (支持正则语法) 示例：{"matching":"","replace":""}`},
	{"MD5", "对传入的值进行MD5加密,配置参数有 (Aa:大写|小写, +-:后加盐|前加盐, [0:16]:截取位数0-16) 示例：A+[0:32]|salt"},
	{"AES", "对传入的参数进行AES加密,参数为secretKey 示例：iQsdAswdsf"},
	{"BASE64", "对传入的参数进行base64加密 示例：nil"},
}

func (a *Argument) Tools() {
	////fmt.println("function_name", a.Function)
	switch a.Function.FunctionName {
	case "nowTimestamp":
		a.nowTimestamp()
		break
	case "nowFormat":
		a.nowFormat()
		break
	case "replace":
		a.replace()
		break
	case "MD5":
		a.md5()
		break
	case "AES":
		a.aesEncrypt()
		break
	case "BASE64":
		break
	}
}

// GetTools 获取所有的 tool case
func GetTools() interface{} {
	return tools
}

// GetValuesEncode 将所有的参数以url参数拼接的形式拼接
func (args *Arguments) GetValuesEncode(argumentType ArgumentType) string {
	values := url.Values{}
	for _, arg := range *args {
		if arg.ArgumentType == argumentType || arg.ArgumentType == Auto {
			values.Add(arg.Key, arg.Value)
		}
	}
	return values.Encode()
}
